////////////////////////////////////////////////////////////////////////////////

#include "bullet.h"
#include "common_types.h"

////////////////////////////////////////////////////////////////////////////////

#include <cassert>
#include <cmath>
#include <numeric>

////////////////////////////////////////////////////////////////////////////////


Bullet::Bullet( const STM::Position& _position, const STM::ScrPosition& _aimPosition )
: m_Damage(0),
  m_Destroyed(false)
{
    SetPosition( _position );

    const double defaultBulletVelocity = 12;
    SetAbsoluteVelocity(defaultBulletVelocity);

    double dx = _aimPosition.first - _position.first;
    double dy = _aimPosition.second - _position.second;
    double hyp = pow( dx*dx + dy*dy, 0.5 );
    
    STM::Velocity velocity(0,0);

    // Calculate X and Y velocity
    if ( dy )
        velocity.first = abs(defaultBulletVelocity*(dx/hyp));

    if ( dx )
        velocity.second = abs(defaultBulletVelocity*(dy/hyp));

    if ( dy < 0.0 )
        velocity.second = -velocity.second;

    if ( dx < 0.0 )
        velocity.first = -velocity.first;

    if ( !dx && !dy )
        velocity.second = defaultBulletVelocity;

    // Set bullet velocity
    SetVelocity( velocity );
}


////////////////////////////////////////////////////////////////////////////////


Bullet::~Bullet()
{
}


////////////////////////////////////////////////////////////////////////////////


void Bullet::SetDamage( int _damage )
{
    assert(_damage >= 0);
    m_Damage = _damage;
}


////////////////////////////////////////////////////////////////////////////////


int Bullet::GetDamage() const
{
    return m_Damage;
}


////////////////////////////////////////////////////////////////////////////////


void Bullet::Move()
{
    if ( !m_Destroyed )
    MovingObject::Move();
    
    if ( GetPosition().first < 0 || GetPosition().first >= 640 ||
         GetPosition().second < 0 || GetPosition().second >= 480 )

         m_Destroyed = true;
}


////////////////////////////////////////////////////////////////////////////////


bool Bullet::IsDestroyed() const
{
    return m_Destroyed;
}


////////////////////////////////////////////////////////////////////////////////
